package util;

import soot.G;
import soot.Scene;
import soot.SootClass;
import soot.SootMethod;
import soot.jimple.infoflow.android.resources.ARSCFileParser;

public class FlowdroidUtils {
    public static void resetFlowDroidEnvironment() {
        G.reset();
        Scene.v().reset();
        System.gc();
        ARSCFileParser.STRICT_MODE = false;
    }

    public static void forceLoadBody(SootMethod sourceMethod) {
        sourceMethod.getDeclaringClass().setApplicationClass();
        Scene.v().forceResolve(sourceMethod.getDeclaringClass().getName(), SootClass.BODIES);
    }

    public static final String[] excludeSourceMethodList = new String[]{
            // android.content.pm.PackageManager: getPackageInfo, getApplicationInfo, getApplicationLabel
            // 这几个方法导致的path太多了,没必要加。 Study for 10 apks: 58000+/99056 source paths
//            "android.content.pm.PackageManager: android.content.pm.PackageInfo getPackageInfo",
//            "android.content.pm.PackageManager: android.content.pm.ApplicationInfo getApplicationInfo",
//            "android.content.pm.PackageManager: java.lang.CharSequence getApplicationLabel",
//            "android.content.pm.PackageManager: java.lang.String getInstallerPackageName",

            // android.database.Cursor 和 log 也太多了; 30534/99056 sources
            // "android.database.Cursor: java.lang.String getString",

            // 4939/99056 sources 同样没必要保留; 太多了是种污染
//             "java.util.Locale: java.lang.String getCountry"
    };
    public static final String[] excludeSinkMethodList = new String[]{
            // 去掉一些 log 方法; Study for 10 apks: 26000+/99056 sinks
            // "android.util.Log: int",
    };
    public static final String[] sentitiveSources = {
            // 1. Network
            // 用于获取与 Wi-Fi 连接相关的信息，如连接状态、SSID、BSSID 等。
            "android.net.wifi.WifiInfo",
            // 用于访问移动网络相关信息，如设备电话号码、网络类型、运营商信息等。
            "android.telephony.TelephonyManager",
            // 用于发送和接收短信，可以管理短信的发送和接收。
            "android.telephony.SmsManager",
            // 用于获取运营商配置信息，如 APN 设置、网络限制等。
            "android.telephony.CarrierConfigManager",
            // 用于管理设备上的订阅信息，如获取设备上的 SIM 卡信息、订阅状态等。
            "android.telephony.SubscriptionManager",
            // 用于执行对移动网络进行扫描的操作，例如扫描附近的移动网络信号。
            "android.telephony.TelephonyScanManager",
            // 用于获取移动网络基站信息，包括当前连接基站的信息、附近基站的信息等。
            "android.telephony.CellInfo",
            // 用于表示移动网络基站的唯一标识符，包括基站类型、MCC/MNC 码等信息。
            "android.telephony.CellIdentity",
            // 用于表示移动网络信号强度，包括信号强度、信号质量等信息。
            "android.telephony.CellSignalStrength",

            // 2. Location
            "android.location.LocationManager",

            // 3. 设备安全设置信息
            "android.provider.Settings.Secure",

            // 4. 程序应用包的相关信息
            "android.content.pm.PackageManager",

            // 5. 设备硬件信息
            "android.os.Build",

            // 6. 账户
            "android.accounts.AccountManager",

            // 7. AdId
            "android.adservices.adid.AdIdManager",
            "android.adservices.appsetid.AppSetIdManager",

            // 8. Bluetooth
            "android.bluetooth.BluetoothManager",

            // 9. 该类可访问设备上的媒体内容，如照片、视频和音频文件，其中可能包含敏感的用户数据。
            "android.provider.MediaStore",

            // 10.该类可访问设备上的联系人信息，这也是敏感用户数据的另一个潜在来源。
            "android.provider.ContactsContract",

            // 11. 该类可访问设备的通话记录
            "android.provider.CallLog",

            // 12. 该类可访问设备的浏览器记录和书签
            "android.provider.Browser",

            //13. 该类可访问设备的剪贴板，其中可能包含敏感的用户复制数据。
            "android.content.ClipboardManager",

            //14. 该类可访问设备的应用程序使用统计信息，这可能会泄露有关用户应用程序使用模式的敏感信息。
            "android.app.usage.UsageStatsManager",

            //15.
            "java.net.InetAddress",
            "android.net.ConnectivityManager",
            "android.content.pm.PermissionInfo",

            //16. get in hashMap may be sources
            "java.util.HashMap",

            //17. 与 ads 有关
            "com.google.ads.consent.ConsentInformation",

            //18. 与 Region有关
            "android.graphics.Region",

            //19. 剪切板
            "android.content.ClipboardManager",

            //20. Cookie
            "android.webkit.CookieManager",
            "android.webkit.CookieSyncManager",
    };
    public static final String[] sentitiveSinks = {
            //1. put in hashMap may be Sinks
            "java.util.HashMap",
            "java.util.Map",

            //2. 剪切板
            "android.content.ClipboardManager",

            //3. Cookie
            "android.webkit.CookieManager",
            "android.webkit.CookieSyncManager",
    };


}
